package com.bcn.login_mybatis_demo.util;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class JwtTokenUtils {
    public static final String TOKEN_HEADER = "Authorization";
    public static final String TOKEN_PREFIX = "Bearer ";
    // 存储用户ID与短token的映射及过期时间
    private static final Map<String, TokenInfo> tokenStore = new HashMap<>();
    private static final long EXPIRE_TIME = 30 * 60 * 1000; // 30分钟过期时间

    // Token信息类
    private static class TokenInfo {
        Integer userId;
        long expireTime;

        TokenInfo(Integer userId, long expireTime) {
            this.userId = userId;
            this.expireTime = expireTime;
        }
    }

    /**
     * 生成短token，返回给用户
     *
     * @param userId 用户ID
     * @return 短token
     */
    public static String sign(Integer userId) {
        String shortToken = UUID.randomUUID().toString().replace("-", "").substring(0, 32);
        long expireTime = System.currentTimeMillis() + EXPIRE_TIME; // 计算过期时间
        tokenStore.put(shortToken, new TokenInfo(userId, expireTime));
        return shortToken;
    }

    /**
     * 验证短token
     *
     * @param token 短token
     * @return 用户ID或null
     */
    public static Integer verifyShortToken(String token) {
        TokenInfo tokenInfo = tokenStore.get(token);
        if (tokenInfo != null && System.currentTimeMillis() < tokenInfo.expireTime) {
            return tokenInfo.userId; // 返回用户ID
        }
        return null; // token无效或已过期
    }

    /**
     * 刷新短token的过期时间
     *
     * @param token 短token
     * @return 是否成功
     */
    public static boolean refreshToken(String token) {
        TokenInfo tokenInfo = tokenStore.get(token);
        if (tokenInfo != null) {
            long newExpireTime = System.currentTimeMillis() + EXPIRE_TIME;
            tokenInfo.expireTime = newExpireTime; // 更新过期时间
            return true; // 刷新成功
        }
        return false; // token无效
    }

    /**
     * 删除短token
     *
     * @param token 短token
     */
    public static void deleteToken(String token) {
        tokenStore.remove(token);
    }

    /**
     * 根据用户ID获取短token
     *
     * @param userId 用户ID
     * @return 短token，如果未找到返回null
     */
    public static String getTokenByUid(Integer userId) {
        for (Map.Entry<String, TokenInfo> entry : tokenStore.entrySet()) {
            if (entry.getValue().userId.equals(userId)) {
                return entry.getKey(); // 返回找到的token
            }
        }
        return null; // 未找到对应的token
    }
}

